package com.yizhi.common.utils;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringEscapeUtils;
/**
 * @author yizhi
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils{
	
	 private static final char SEPARATOR = '_';
	    private static final String CHARSET_NAME = "UTF-8";
	    
	    /**
	     * 转换为字节数组
	     * @param str
	     * @return
	     */
	    public static byte[] getBytes(String str){
	        if (str != null){
	            try {
	                return str.getBytes(CHARSET_NAME);
	            } catch (UnsupportedEncodingException e) {
	                return null;
	            }
	        }else{
	            return null;
	        }
	    }
	    
	    /**
	     * 转换为字节数组
	 
	     * @return
	     */
	    public static String toString(byte[] bytes){
	        try {
	            return new String(bytes, CHARSET_NAME);
	        } catch (UnsupportedEncodingException e) {
	            return EMPTY;
	        }
	    }
	    
	    /**
	     * 是否包含字符串
	     * @param str 验证字符串
	     * @param strs 字符串组
	     * @return 包含返回true
	     */
	    public static boolean inString(String str, String... strs){
	        if (str != null){
	            for (String s : strs){
	                if (str.equals(trim(s))){
	                    return true;
	                }
	            }
	        }
	        return false;
	    }
	    
	    /**
	     * 替换掉HTML标签方法
	     */
	    public static String replaceHtml(String html) {
	        if (isBlank(html)){
	            return "";
	        }
	        String regEx = "<.+?>";
	        Pattern p = Pattern.compile(regEx);
	        Matcher m = p.matcher(html);
	        String s = m.replaceAll("");
	        return s;
	    }
	    public static String msgfmt(Exception e) {
	        StringBuffer sb = new StringBuffer();
	        sb.append(e.getMessage());
	        for (StackTraceElement el : e.getStackTrace()) {
	            sb.append(el+"\n");
	        }
	        return sb.toString();
	    }
	    /**
	     * 替换为手机识别的HTML，去掉样式及属性，保留回车。
	     * @param html
	     * @return
	     */
	    public static String replaceMobileHtml(String html){
	        if (html == null){
	            return "";
	        }
	        return html.replaceAll("<([a-z]+?)\\s+?.*?>", "<$1>");
	    }
	    
	    /**
	     * 替换为手机识别的HTML，去掉样式及属性，保留回车。
	     * @param txt
	     * @return
	     */
	    public static String toHtml(String txt){
	        if (txt == null){
	            return "";
	        }
	        return replace(replace(Encodes.escapeHtml(txt), "\n", "<br/>"), "\t", "&nbsp; &nbsp; ");
	    }
	 
	    /**
	     * 缩略字符串（不区分中英文字符）
	     * @param str 目标字符串
	     * @param length 截取长度
	     * @return
	     */
	    public static String abbr(String str, int length) {
	        if (str == null) {
	            return "";
	        }
	        try {
	            StringBuilder sb = new StringBuilder();
	            int currentLength = 0;
	            for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
	                currentLength += String.valueOf(c).getBytes("GBK").length;
	                if (currentLength <= length - 3) {
	                    sb.append(c);
	                } else {
	                    sb.append("...");
	                    break;
	                }
	            }
	            return sb.toString();
	        } catch (UnsupportedEncodingException e) {
	            e.printStackTrace();
	        }
	        return "";
	    }
	    
	    public static String abbr2(String param, int length) {
	        if (param == null) {
	            return "";
	        }
	        StringBuffer result = new StringBuffer();
	        int n = 0;
	        char temp;
	        boolean isCode = false; // 是不是HTML代码
	        boolean isHTML = false; // 是不是HTML特殊字符,如&nbsp;
	        for (int i = 0; i < param.length(); i++) {
	            temp = param.charAt(i);
	            if (temp == '<') {
	                isCode = true;
	            } else if (temp == '&') {
	                isHTML = true;
	            } else if (temp == '>' && isCode) {
	                n = n - 1;
	                isCode = false;
	            } else if (temp == ';' && isHTML) {
	                isHTML = false;
	            }
	            try {
	                if (!isCode && !isHTML) {
	                    n += String.valueOf(temp).getBytes("GBK").length;
	                }
	            } catch (UnsupportedEncodingException e) {
	                e.printStackTrace();
	            }
	 
	            if (n <= length - 3) {
	                result.append(temp);
	            } else {
	                result.append("...");
	                break;
	            }
	        }
	        // 取出截取字符串中的HTML标记
	        String temp_result = result.toString().replaceAll("(>)[^<>]*(<?)",
	                "$1$2");
	        // 去掉不需要结素标记的HTML标记
	        temp_result = temp_result
	                .replaceAll(
	                        "</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>",
	                        "");
	        // 去掉成对的HTML标记
	        temp_result = temp_result.replaceAll("<([a-zA-Z]+)[^<>]*>(.*?)</\\1>",
	                "$2");
	        // 用正则表达式取出标记
	        Pattern p = Pattern.compile("<([a-zA-Z]+)[^<>]*>");
	        Matcher m = p.matcher(temp_result);
	        List<String> endHTML =new ArrayList<String>();
	        while (m.find()) {
	            endHTML.add(m.group(1));
	        }
	        // 补全不成对的HTML标记
	        for (int i = endHTML.size() - 1; i >= 0; i--) {
	            result.append("</");
	            result.append(endHTML.get(i));
	            result.append(">");
	        }
	        return result.toString();
	    }
	    
	    /**
	     * 转换为Double类型
	     */
	    public static Double toDouble(Object val){
	        if (val == null){
	            return 0D;
	        }
	        try {
	            return Double.valueOf(trim(val.toString()));
	        } catch (Exception e) {
	            return 0D;
	        }
	    }
	 
	    /**
	     * 转换为Float类型
	     */
	    public static Float toFloat(Object val){
	        return toDouble(val).floatValue();
	    }
	 
	    /**
	     * 转换为Long类型
	     */
	    public static Long toLong(Object val){
	        return toDouble(val).longValue();
	    }
	 
	    /**
	     * 转换为Integer类型
	     */
	    public static Integer toInteger(Object val){
	        return toLong(val).intValue();
	    }
	    
	 
	    /**
	     * 获得用户远程地址
	     */
	    public static String getRemoteAddr(HttpServletRequest request){
	        String remoteAddr = request.getHeader("X-Real-IP");
	        if (isNotBlank(remoteAddr)) {
	            remoteAddr = request.getHeader("X-Forwarded-For");
	        }else if (isNotBlank(remoteAddr)) {
	            remoteAddr = request.getHeader("Proxy-Client-IP");
	        }else if (isNotBlank(remoteAddr)) {
	            remoteAddr = request.getHeader("WL-Proxy-Client-IP");
	        }
	        return remoteAddr != null ? remoteAddr : request.getRemoteAddr();
	    }
	 
	    /**
	     * 驼峰命名法工具
	     * @return
	     *         toCamelCase("hello_world") == "helloWorld" 
	     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
	     *         toUnderScoreCase("helloWorld") = "hello_world"
	     */
	    public static String toCamelCase(String s) {
	        if (s == null) {
	            return null;
	        }
	 
	        s = s.toLowerCase();
	 
	        StringBuilder sb = new StringBuilder(s.length());
	        boolean upperCase = false;
	        for (int i = 0; i < s.length(); i++) {
	            char c = s.charAt(i);
	 
	            if (c == SEPARATOR) {
	                upperCase = true;
	            } else if (upperCase) {
	                sb.append(Character.toUpperCase(c));
	                upperCase = false;
	            } else {
	                sb.append(c);
	            }
	        }
	 
	        return sb.toString();
	    }
	 
	    /**
	     * 驼峰命名法工具
	     * @return
	     *         toCamelCase("hello_world") == "helloWorld" 
	     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
	     *         toUnderScoreCase("helloWorld") = "hello_world"
	     */
	    public static String toCapitalizeCamelCase(String s) {
	        if (s == null) {
	            return null;
	        }
	        s = toCamelCase(s);
	        return s.substring(0, 1).toUpperCase() + s.substring(1);
	    }
	    
	    /**
	     * 驼峰命名法工具
	     * @return
	     *         toCamelCase("hello_world") == "helloWorld" 
	     *         toCapitalizeCamelCase("hello_world") == "HelloWorld"
	     *         toUnderScoreCase("helloWorld") = "hello_world"
	     */
	    public static String toUnderScoreCase(String s) {
	        if (s == null) {
	            return null;
	        }
	 
	        StringBuilder sb = new StringBuilder();
	        boolean upperCase = false;
	        for (int i = 0; i < s.length(); i++) {
	            char c = s.charAt(i);
	 
	            boolean nextUpperCase = true;
	 
	            if (i < (s.length() - 1)) {
	                nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
	            }
	 
	            if ((i > 0) && Character.isUpperCase(c)) {
	                if (!upperCase || !nextUpperCase) {
	                    sb.append(SEPARATOR);
	                }
	                upperCase = true;
	            } else {
	                upperCase = false;
	            }
	 
	            sb.append(Character.toLowerCase(c));
	        }
	 
	        return sb.toString();
	    }
	    
	    /**
	     * 如果不为空，则设置值
	     * @param target
	     * @param source
	     */
	    public static void setValueIfNotBlank(String target, String source) {
	        if (isNotBlank(source)){
	            target = source;
	        }
	    }
	 
	    /**
	     * @param target
	 
	     */
	    public static int lastIndexOf(String target, String str) {
	        if(isBlank(target) || isBlank(str)){
	            return -1;
	        }
	        return target.lastIndexOf(str);
	    }
	 
	    /**
	     * 转换为JS获取对象值，生成三目运算返回结果
	     * @param objectString 对象串
	     *   例如：row.user.id
	     *   返回：!row?'':!row.user?'':!row.user.id?'':row.user.id
	     */
	    public static String jsGetVal(String objectString){
	        StringBuilder result = new StringBuilder();
	        StringBuilder val = new StringBuilder();
	        String[] vals = split(objectString, ".");
	        for (int i=0; i<vals.length; i++){
	            val.append("." + vals[i]);
	            result.append("!"+(val.substring(1))+"?'':");
	        }
	        result.append(val.substring(1));
	        return result.toString();
	    }
}
